﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using SistemaBastanteo.Negocio;
using SistemaBastanteo.Dominio;
using Spring.Context.Support;
using SistemaBastanteo.Persistencia;

namespace SistemaBastanteo.Pruebas
{
    [TestFixture]
    public class Test09_MantenimientoService
    {
        IApplicationContext Spring = null;
        IMantenimientoService Service = null;
        Cliente clienteRegistrado = null;
        Representante representanteRegistrado = null;
        TipoEmpresa tipoCreado = null;
        TipoDocumento tipoDocCreado = null;
        Poder poderCreado = null;

        [TestFixtureSetUp]
        public void IniciarPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaBastanteo/SistemaBastanteo/capaPersistencia.xml",
                "assembly://SistemaBastanteo/SistemaBastanteo/capaNegocio.xml"
                );
            Service = (IMantenimientoService)Spring.GetObject("mantenimientoService");
            tipoCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpresaDAO_NH")).Crear(
                new TipoEmpresa() { Abreviacion = "SAA" });
            tipoDocCreado = ((ITipoDocumentoDAO)Spring.GetObject("tipoDocumentoDAO_NH")).Crear(
                new TipoDocumento() { Descripcion="DNI"});

        }
        [Test]
        public void Test1_RegistrarCliente_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarCliente("12345678901", "Cliente de Prueba", DateTime.Now,  0, tipoCreado.Codigo);
            });
        }
        [Test]
        public void Test2_RegistrarCliente_Ok()
        {
            Assert.DoesNotThrow(delegate
            {
                clienteRegistrado = Service.RegistrarCliente("12345678901", "Cliente de Prueba", DateTime.Now,
                     10, tipoCreado.Codigo);
            });
            Assert.IsNotNull(clienteRegistrado);
            Assert.Greater(clienteRegistrado.Codigo, 0);
            Assert.AreEqual(clienteRegistrado.Ruc, "12345678901");
            Assert.AreEqual(clienteRegistrado.RazonSocial, "Cliente de Prueba");
            Assert.AreEqual(clienteRegistrado.Tipo.Codigo, tipoCreado.Codigo);
            Assert.AreEqual(clienteRegistrado.Empleados, 10);
        }
        [Test]
        public void Test3_RegistrarCliente_Repetido()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarCliente("12345678901", "Cliente de Prueba", DateTime.Now, 10, tipoCreado.Codigo);
            });
        }

        [Test]
        public void Test4_RegistrarRepresentante_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarRepresentante(tipoDocCreado.Codigo,"41404714", "Jenny","Roman Perez", null,"A", clienteRegistrado.Codigo);
            });
        }
        [Test]
        public void Test5_RegistrarRepresentante_Ok()
        {
            Assert.DoesNotThrow(delegate
            {
                representanteRegistrado = Service.RegistrarRepresentante(tipoDocCreado.Codigo,"41404714", "Jenny","Roman Perez", "Administradora","A", clienteRegistrado.Codigo);
                     
            });
            Assert.IsNotNull(representanteRegistrado);
            Assert.Greater(representanteRegistrado.Codigo, 0);
            Assert.AreEqual(representanteRegistrado.TipoDocumento.Codigo, tipoDocCreado.Codigo );
            Assert.AreEqual(representanteRegistrado.Documento, "41404714");
            Assert.AreEqual(representanteRegistrado.Nombres, "Jenny");
            Assert.AreEqual(representanteRegistrado.Apellidos, "Roman Perez");
            Assert.AreEqual(representanteRegistrado.Cargo, "Administradora");
            Assert.AreEqual(representanteRegistrado.Grupo, "A");
            Assert.AreEqual(representanteRegistrado.Cliente.Codigo , clienteRegistrado.Codigo);

        }
        [Test]
        public void Test6_RegistrarRepresentante_Repetido()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarRepresentante(tipoDocCreado.Codigo, "41404714", "Jennifer", "Roman Perez", "Administradora", "A", clienteRegistrado.Codigo);
            });
        }

        [Test]
        public void Test7_RegistrarPoder_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarPoder("EFRET", "Retiro Efectivo", null);
            });
        }

        [Test]
        public void Test8_RegistrarPoder_Ok()
        {
            Assert.DoesNotThrow(delegate
            {
                poderCreado = Service.RegistrarPoder("EFRET", "Retiro Efectivo", "Activo");
            });
            Assert.IsNotNull(poderCreado);
            Assert.Greater(poderCreado.Codigo, 0);
            Assert.AreEqual(poderCreado.CodigoCorto, "EFRET");
            Assert.AreEqual(poderCreado.Descripcion, "Retiro Efectivo");
            Assert.AreEqual(poderCreado.TipoProducto, "Activo");

        }

        [Test]
        public void Test9_RegistrarPoder_Repetido()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarPoder("EFRET", "Cliente de Prueba", "Activo");
            });
        }


        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistrado);
            ((ITipoDocumentoDAO)Spring.GetObject("tipoDocumentoDAO_NH")).Eliminar(tipoDocCreado);
            ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteRegistrado);
            ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpresaDAO_NH")).Eliminar(tipoCreado);
            ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poderCreado);
            Spring.Dispose();
            Spring = null;
        }
    }
}